package club.jdiy.core.base;

import club.jdiy.core.base.domain.DBEntity;

import java.util.List;
import java.util.Optional;

/**
 * JDiy Dao层基础增删改查通用方法接口.  基本与SpringData-JPA保持一致
 * @param <T> Entity实体类
 * @param <ID> 实体类的主键类型
 *
 * @author ziquee(子秋) QQ号:39886616 主页: http://www.jdiy.club
 * @version 20210309
 */
@SuppressWarnings("unused")
public interface JpaCrud<T extends DBEntity<ID>, ID> {
    boolean existsById(ID id);

    Optional<T> findById(ID id);

    List<T> findAllById(Iterable<ID> ids);

    List<T> findAll();

    T getOne(ID id);

    long count();

    <S extends T> S save(S entity);

    <S extends T> Iterable<S> saveAll(Iterable<S> entities);

    void deleteById(ID id);

    void delete(T entity);

    void deleteAll(Iterable<? extends T> entities);


    /**
     * 插入数据。 与{@link #save(DBEntity)}方法不同的是，此方法不根据主键检测数据记录是否存在，
     * 直接执行insert。 当库中有现有记录已存在，将直接抛出异常。
     */
    void insert(T entity);
    void insertAll(Iterable<T> entities);
}
